//
//  JGVividEngine.h
//  JGVividEngine
//
//  Created by jagger.tu on 2024/6/3.
//

#import <Foundation/Foundation.h>

//! Project version number for JGVividEngine.
FOUNDATION_EXPORT double JGVividEngineVersionNumber;

//! Project version string for JGVividEngine.
FOUNDATION_EXPORT const unsigned char JGVividEngineVersionString[];

#import <Foundation/Foundation.h>
#import <JGVividEngine/JGView.h>
#import <JGVividEngine/JGControlEvent.h>
#import <JGVividEngine/JGGamepadEvent.h>
#import <JGVividEngine/JGKeyboardEvent.h>
#import <JGVividEngine/JGMouseEvent.h>
#import <JGVividEngine/JGTouchEvent.h>
#import <JGVividEngine/JGAccount.h>
#import <JGVividEngine/JGVividEngineDataDefine.h>
#import <JGVividEngine/JGVividEngineEvent.h>
#import <JGVividEngine/JGDebugDataSourceDelegate.h>
#import <JGVividEngine/JGQualityInfo.h>
#import <JGVividEngine/JGVividEngineInfo.h>
#import <JGVividEngine/JGPipView.h>
#import <JGVividEngine/JGTestGroup.h>
#import <JGVividEngine/JGVividEngineEventReceiver.h>
#import <JGVividEngine/JGHttpDNS.h>
#import <JGVividEngine/JGAreaSpecInfo.h>


NS_ASSUME_NONNULL_BEGIN

/// 主功能入口类,是一个单例
@interface JGVividEngine : NSObject

+ (instancetype)sharedInstance;

/// 一些数据信息.注意:某些信息需要在特定状态下才是有效值
@property (nonatomic,strong,readonly) JGVividEngineInfo *info;

/// 渲染View
@property (nonatomic, strong, readonly) JGView *renderedView;

/// 小窗口view,用于实现iOS的画中画等功能,不用时需要将其设置成空, 避免不必要的性能浪费
/// 如果没有会自动创建
@property (nonatomic, strong, nullable) JGPipView *pipView;

/// 触控View,触模事件接收与处理
@property (nonatomic, strong, readonly) JGView *touchView API_AVAILABLE(ios(8.0));

/// 事件通知的key ,useSystemNotication 必须是YES,默认是NO
@property (nonatomic, strong, readonly) NSNotificationName eventNotificationName;

/// 当前版本
@property (nonatomic, strong, readonly) NSString *version;

/// 配置版本
@property (nonatomic, strong, readonly) NSString *configureVersion;

/// 内置测试用例
@property (nonatomic, strong, readonly) JGTestGroup *testGroup;

/// 审核模式,用于apple store 审核用,串流使用的是 websocket方便使用全球加速专线网络
/// 会降低码流,视频流清晰度等配置
/// 主要是防止apple store 审核时由于网络原因导致串流失败.
/// 注意:⚠️正常情况下不要使用,仅在审核时开启,审核完成发布上线后停止,否则将导致串流异常和体验差
/// 仅支持 正式环境, 其他环境暂时不支持加速专线网络
@property (nonatomic, assign) BOOL bAmericaPrivateNetwork;

#pragma mark - 事件监听

/// 是否使用系统通知接收事件,只有设置成YES时才能收到 eventNotificationName 通知
///  调用必须发生在 `authenticateWithAccount:`接口之前,否则可能遗漏事件
/// - Parameter bUseSystemNotication: 默认NO,
- (void)useSystemNotication:(BOOL)bUseSystemNotication;

/// 添加事件接收者,可以添加多个.这个接受者在内是弱引用.
/// - Parameter receiver: 事件接收者
- (void)addEventReceiver:(id<JGVividEngineEventReceiver>)receiver;

/// 移除事件接收者
/// - Parameter receiver: 事件接收者
- (void)removeEventReceiver:(id<JGVividEngineEventReceiver>)receiver;

#pragma mark - 鉴权与登录

/// 使用合法的账号进行认证鉴权,除本api和事件监听外,其他api 需要鉴权通过(即收到`JGStatusAuthSuccess`)后,调用才生效.
/// - Parameter accont: 账号
- (void)authenticateWithAccount:(JGAccount *)accont;

#pragma mark - 开始与结束

/// 准备资源并启动游戏
/// - Parameters:
///   - gameId: 游戏gid
///   - prodata: 启动前透传给云端游戏的数据
- (void)startWithGameId:(NSInteger)gameId prodata:(NSString*)prodata;

/// 准备资源并启动游戏
/// - Parameter gameId: 游戏gid
- (void)startWithGameId:(NSInteger)gameId;

/// 连接远端手柄资源
/// - Parameter params: 传入扫码手柄的参数
- (void)startQRControllerWithParameter:(NSDictionary *)params;

/// 结束游戏并释放资源并会阻断事件的回调
- (void)stop;

/// 强行中断与`stop`不同是直接结束,不会通知云端释放资源等.
- (void)interrupt;

/// 手动重新开始一次拉流,用来进行一次恢复串流, 一般无需调用
/// 待验证接口必要性
- (void)resumeStream;

#pragma mark - 实例相关

/// 更新基本游戏信息
/// - Parameters:
///   - info: 游戏信息
///   - completionHandler: 结果回调,code == 0 表示成功,其他为失败
- (void)updateGameBaseInfoWithInfo:(NSDictionary *)info
                 completionHandler:(void(^)(NSInteger code,NSString *msg,NSError * _Nullable error))completionHandler;
                
///  重新开始游戏,不断开串流
/// - Parameter completionHandler: 结果回调,code == 0 表示成功,其他为失败
- (void)restartGame:(void(^)(NSInteger code,NSString *msg,NSError * _Nullable error))completionHandler;

/// 根据文件名获取文件下载地址
/// - Parameters:
///   - fileName: 文件名称
///   - urlEncode: 是否进行URL 编码
- (NSString *)getDownloadFileUrlWithName:(NSString *)fileName urlEncode:(BOOL)urlEncode;

/// 根据文件名下载文件
/// - Parameters:
///   - fileName: 文件名称
///   - completion: 回调结果
- (void)downloadFileWithName:(NSString *)fileName  completion:(void(^)(NSData *_Nullable data ,NSError * _Nullable error))completion;

/// 根据文件名获取到上传文件的地址. 使用表单上传,格式为
/// 上传http协议类型为 "PUT"
/// 上传文件格式是form-data.
///  key是"file", value 是文件数据
/// - Parameters:
///   - fileName: 文件名称
///   - type: 文件类型,目前只支持 0 ,表示图片
///   - urlEncode: 是否进行URL 编码
- (NSString *)getUploadFileWithName:(NSString *)fileName type:(int)type urlEncode:(BOOL)urlEncode;


/// 上传文件,仅适用于上传较小的文件,如果是图片需要进行压缩.否则影响整体性能
/// - Parameters:
///   - fileName: 文件名
///   - data: 文件数据
///   - type: 文件类型,目前只支持 0 ,表示图片
///   - contentType: http下的内容类型 例如图片JPEG: image/jpeg ,PNG: image/png GIF: image/gif,BMP: image/bmp, TIFF: image/tiff, WebP: image/webp
///   - progress: 上传进度回调
///   - completionHandler: 回调结果
- (void)uploadFileWithName:(NSString *)fileName data:(NSData *)data type:(int)type contentType:(NSString *)contentType  progress:(void(^ _Nullable)(int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend))progress completion:(void(^ _Nullable)(NSInteger code,NSString *msg,NSError * _Nullable error))completionHandler;

/// 上传文件,仅适用于上传较大文件.
/// - Parameters:
///   - fileName: 文件名
///   - filePath: 本地文件路径
///   - type: 文件类型,目前只支持 0 ,表示图片
///   - contentType: http下的内容类型 例如图片JPEG: image/jpeg ,PNG: image/png GIF: image/gif,BMP: image/bmp, TIFF: image/tiff, WebP: image/webp
///   - progress: 上传进度回调
///   - completionHandler: 回调结果
- (void)uploadFileWithName:(NSString *)fileName filePath:(NSString *)filePath type:(int)type contentType:(NSString *)contentType  progress:(void(^ _Nullable)(int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend))progress completion:(void(^ _Nullable)(NSInteger code,NSString *msg,NSError * _Nullable error))completionHandler;

/// 通过文件URL上传文件, 即将url 所在的文件下载到云端指定目录下
/// - Parameters:
///   - path: 云端文件路径
///   - fileUrl: 文件所在url
///   - completionHandler: 结果回调
- (void)uploadFileByUrlWithpath:(NSString *)path fileUrl:(NSString *)fileUrl completion:(void(^)(NSInteger code,NSString *msg,NSError * _Nullable error))completionHandler;

/// 获取屏幕快照
/// - Parameter completion: 返回结果
- (void)screenshotWithcompletion:(void(^)(NSData *_Nullable data ,NSError * _Nullable error))completion;

/// 改变屏幕实例分辨率,变更动作比较大,非特殊不推荐使用
/// - Parameters:
///   - width: 宽度
///   - height: 高度
///   - forceHeight: 是否可以图片vq档位设置. 为 0 表示不突破
///   - completion: 回调结果, code 0 表示成功,desktopWidth x desktopHeight 表示调整后的桌面分辨率的宽度和高度
- (void)changeScreenResolutionWithWidth:(int)width height:(int)height forceHeight:(int)forceHeight completion:(void (^)(int desktopWidth,int desktopHeight,int code))completion;

/// 设置设备标识符,仅对arm实例生效
/// @param IMEI 设备的国际移动设备识别码
/// @param mac 设备的 MAC 地址
/// @param androidId 安卓设备的 Android ID
- (void)setDeviceIdentifiersWithIMEI:(NSString * _Nullable)IMEI mac:(NSString * _Nullable)mac androidId:(NSString * _Nullable)androidId;

/// 发送游戏透传信息
/// @param info  信息
- (void)sendPassThrough:(NSData *)info;

#pragma mark - 连接相关设置

/// 指定区域和实例
/// - Parameters:
///   - areaType: 区域id
///   - vmId: 实例id
- (void)setAreaType:(NSInteger)areaType vmId:(NSInteger)vmId;

/// 设置流连接模式.默认使用 `JGConnectTypeXRTC`
/// - Parameter type: 见`JGConnectType`
- (void)setStreamConnectType:(JGConnectType)type;

/// 同实例时设置允许其他人加入的模式
/// - Parameter mode: 见`JGPlayMode`
- (void)setAllowJoinMode:(JGPlayMode)mode;

/// 设置进入其他人房间时的模式
/// - Parameter mode:见`JGPlayMode`
- (void)setJoinMode:(JGPlayMode)mode;

/// 当加入类型是 协助,对战,切屏等模式时需要添加
/// - Parameter targetUUID:要协助,对战,切屏的目标UUID
- (void)setTargetUUID:(uint64_t)targetUUID;

/// 设置启动云端应用或游戏的参数
/// - Parameters:
///   - bizType: 参数业务类型
///   - params: 参数信息
- (BOOL)setBizType:(JGBizType)bizType params:(NSString *)params;

/// 分配到实例后禁止自动拉,例如收到排队通知时设置成YES,排队完成收到实例分配成功通知后,设置成NO
///  当设置成NO时会自动开始拉流
///  注意:如果设置成YES,在没有调用 `authenticateWithAccount` 前会一直有效
/// - Parameter bDisable: YES 禁止自动拉流 | NO 允许自动拉流,当从YES 设置成NO时,如果分配实例成功,会自动拉流一次
- (void)setDisableAutoPullStream:(BOOL)bDisable;

/// 获取当前禁用状态
- (BOOL)getDisableAutoPullStream;

/// 设置与后台相关的超时时间,如果小于0 会被重置成60s,如果设置成0, 则不做调整
/// - Parameters:
///   - heartbeatTimeout: 心跳超时,单位秒
///   - idleAlertTimeout: 闲置告警超时,单位秒
///   - idleTimeout: 闲置超时,单位秒
- (void)setHeartbeatTimeout:(uint32_t)heartbeatTimeout  idleAlertTimeout:(uint32_t)idleAlertTimeout idleTimeout:(uint32_t)idleTimeout;


/// 设置串流时的端口类型,一般无需调用,仅在认证成功后开始之前设置有效
/// - Parameter bDisable: YES 表示禁止使用端口map形式,NO表示允许,但不一定是端口map形式
- (void)disableUsePortMap:(BOOL)bDisable;

#pragma mark - 操控相关

/// 设置游戏类型
/// - Parameter gameType: 游戏类型
- (void)setGameType:(JGGameType)gameType rotation:(JGStreamRotation)rotation;

/// 设置触控事件转换成远端的类型,默认是触控
/// - Parameter touchType: `JGTouchType`
- (void)setTouchType:(JGTouchType)touchType;

/// 给云端应用或游戏发送消息,云端应用需要接入SDK.
/// - Parameter data: 发送的内容
- (JGSendGameDataResult)sendGameData:(NSData *)data;

/// 给云端应用或游戏发送消息,云端应用需要接入SDK.
/// - Parameters:
///   - data: 发送的内容
///   - bUseOldVersion: 确定是新协议版本,还是老协议版本
- (JGSendGameDataResult)sendGameData:(NSData *)data bUseOldVersion:(BOOL)bUseOldVersion;


/// 给云端应用或游戏发送消息,云端应用需要接入SDK.
/// - Parameters:
///   - data:发送的内容
///   - bUseOldVersion: 确定是新协议版本,还是老协议版本
///   - bDebug: 如果是debug 会输出日志,建议调试完成后关闭debug日志,否则频繁发送可能导致较大的性能消耗,出现异常
- (JGSendGameDataResult)sendGameData:(NSData *)data bUseOldVersion:(BOOL)bUseOldVersion debug:(BOOL)bDebug;

/// 发生控制事件(一次发送多个)
/// - Parameter events: 事件数组
- (void)sendEvents:(NSArray<JGControlEvent*>*)events;

/// 发生控制事件(一次发送一个)
/// - Parameter events: 事件
- (void)sendControlEvent:(JGControlEvent*)event;

/// 向云端插入手柄 `JGStatusGamepadAllocSuccess` 返回成功结果
/// `JGStatusGamepadAllocFailed` 返回失败结果
/// - Parameter deviceId: 本地手柄的设备Id
/// - Parameter name: 手柄名称
- (void)addGameControllerWithDeviceId:(NSUInteger)deviceId name:(NSString *)name;

/// 获取手柄的远端控制证书
/// - Parameters:
///   - slotId: 虚拟卡槽
///   - deviceId: 设备ID
///   - cert: 手柄控制证书
- (void)requestGamepadCertWithSlotId:(uint64_t)slotId deviceId:(uint64_t)deviceId cert:(NSString * _Nullable)cert;

/// 移除云端指定手柄 `JGStatusGamepadReleaseSuccess` 返回成功结果
/// `JGStatusGamepadReleaseFailed` 返回失败结果
/// - Parameters:
///   - deviceId: 本地手柄的设备ID
///   - slotId: 云端插槽ID
- (void)removeGameControllerWithDeviceId:(NSUInteger)deviceId slotId:(NSUInteger)slotId;

/// 发生文本到云端输入框,前提是云端输入框处于激活状态
/// - Parameter text: 文本内容,如果为空将默认转换成退格键
- (void)sendTextToCloudInputField:(NSString *)text ;

///发生文本到云端输入框,前提是云端输入框处于激活状态
/// - Parameters:
///   - text:文本内容,如果为空将默认转换成退格键
///   - bAppend: 不清空之前的输入,直接追加在末尾
- (void)sendTextToCloudInputField:(NSString *)text bAppend:(BOOL)bAppend;

/// 发生文本到云端输入框,前提是云端输入框处于激活状态
/// - Parameters:
///   - text: 本内容,如果为空将默认转换成退格键
///   - bAppend: 不清空之前的输入,直接追加在末尾
///   - useClipboard: 云端的通道方式,YES表示使用剪贴板通道 NO表示使用键盘输入通道
- (void)sendTextToCloudInputField:(NSString *)text bAppend:(BOOL)bAppend useClipboard:(BOOL)useClipboard;

/// 发送退格键到云端,例如清除云端文本框中已输入的内容
- (void)sendBackspaceKey;

/// 更新云端键盘高度,仅支持手游类型
/// - Parameter height: 高度值
- (void)updateCloudKeyboardPopupHeight:(uint16_t)height;

/// 设置云端的键盘类型,仅支持手游
/// @param type  0：软键盘（默认值）；1：硬件键盘
/// @param inputMethodType  0：云端输入法（默认值）；1：客户端本地输入法
- (void)cloudKeybordType:(int)type inputMethodType:(int)inputMethodType;

/// 隐藏云端键盘,仅支持手游类型
- (void)hideRemoteKeyboard;

/// 输出完成,例如键盘上的Return 键,仅支持手游类型
- (void)shouldReturnFromKeyboar;

/// 通知云端本地键盘弹出,仅支持手游类型
- (void)localPushKeyborad;

/// 发送安卓系统按键 -- 某些实例可能支持
/// - Parameter button: 按键类型见`JGAndroidSystemButton`
- (void)sendAndroidSystemButtonWithKey:(JGAndroidSystemButton)button;

/// 收到闲置超时后,请求继续游戏,通过点击 0.05,0.05,或 移动鼠标,1,1 -> 1,-1实现
- (void)requestContinuePlayGame;

/// 给云端剪贴板设置数据,最大数据为 65000.
- (void)setCloudClipboardData:(NSData *)data;

/// 同步地理坐标数据到云端,注意不可频繁调用,每秒不要超过60次,否则影响性能
/// @param latitude 纬度
/// @param longitude 经度
/// @param altitude 海拔
- (void)sendCoordinatesWithLatitude:(float)latitude longitude:(float)longitude altitude:(float)altitude;

/// 同步陀螺仪数据到云端,注意不可频繁调用,每秒不要超过60次,否则影响性能
/// @param x X轴数据
/// @param y Y轴数据
/// @param z Z轴数据
- (void)sendGyroDataWithX:(float)x y:(float)y z:(float)z;

/// 同步加速度计数据,注意不可频繁调用,每秒不要超过60次,否则影响性能
/// @param x X轴数据
/// @param y Y轴数据
/// @param z Z轴数据
- (void)sendAccelerometerWithX:(float)x y:(float)y z:(float)z;

/// 通知云端暂停发流数据或重新开始发流数据
/// @param bPause 是否暂停
- (void)streamStatusWithPause:(BOOL)bPause;

/// 启动后更新设置主机是否支持同实例与模式
/// @param hostMethod 0 | 1
- (void)setHostMethod:(int32_t)hostMethod;

/// 禁止控制事件发送
/// @param bDisable  YES 表示禁止
- (void)disableControlEvent:(BOOL)bDisable;

/// 设置录屏状态,仅支持手游实例
- (void)setRecoredScreenState:(JGRecordScreenState)state;

/// 发送游戏登录信息,仅支持arm手游
/// - Parameter info: 登录信息
- (void)sendGameLoginInfo:(NSString *)info;

/// 禁用SDK内部提供的基础touch控制
- (void)setDisableBaseTouch:(BOOL)disable;

#pragma mark - 视频相关

/// 设置视频档位,默认 `JGVideoLevelMiddle`
///  档位里面包含了帧率,码率,分辨率等配置. 单独设置以后设置的为准
/// - Parameter level: 见`JGVideoLevel`
- (void)setVideoLevel:(JGVideoLevel)level;

/// 设置视频帧率,默认`JGVideoFrameHightFPS`
/// - Parameter frameRate: 见`JGVideoFrame`
- (void)setVideoFrameRate:(JGVideoFrame)frameRate;

/// 设置视频流的分辨率,默认`1080P,非全屏`
/// - Parameters:
///   - videoQuality: 见`JGVideoResolution`
///   - bFullScreen: 如果设置成YES 会根据当前屏幕比例进行换算,向云端请求对应分辨率比例的流,不一定总是成功的,以实际返回流大小为准
- (void)setVideoQuality:(JGVideoResolution)videoQuality bFullScreen:(BOOL)bFullScreen;

/// 设置视频流的分辨率,默认`1080P,非全屏`
/// - Parameters:
///   - videoQuality: 见`JGVideoResolution`
///   - scale: 根据当前比例进行换算,向云端请求对应分辨率比例的流,不一定总是成功的,以实际返回流大小为准
- (void)setVideoQuality:(JGVideoResolution)videoQuality customScale:(double)scale;

/// 设置视频码率适应模式,默认`JGBitrateGuidanceAdjustModeFluency`
/// - Parameter mode:见 `JGBitrateGuidanceAdjustMode`
- (void)setVideoBitrateGuidanceAdjustMode:(JGBitrateGuidanceAdjustMode)mode;

/// 视频填充模式
/// - Parameter mode: 见`JGVideoFillMode`
- (void)setVideoFillMode:(JGVideoFillMode)mode;

/// 设置渲染方式
/// - Parameter type: 见`JGVideoRenderedType`
- (void)setVideoRenderedType:(JGVideoRenderedType)type;

/// 设置视频流状态,暂停|继续,必须串流成功后才生效
/// - Parameter status: 见`JGStreamStatus`
- (void)setVideoStreamStatus:(JGStreamStatus)status;

/// 将开始画中画模式
- (void)WillStartPipMode;

/// 停止画中画模式
- (void)stopPipMode;

/// 设置云端视频的亮度,对比度,饱和度.需要云端支持才生效
/// - Parameters:
///   - brightness: 亮度,取值[-100,100]
///   - contrast: 对比度,取值[-100,100]
///   - saturation: 饱和度,取值[-100,100]
- (void)setVideoWithBrightness:(int8_t)brightness contrast:(int8_t)contrast saturation:(int8_t)saturation;

/// 强制启用画质增强
/// - Parameter enabled: 是否强制启用
- (void)enableVideoQualityEnhancement:(BOOL)enabled;

/// 打开本地摄像头,并向云端摄像头传送数据,性能不高,一般不推荐使用这种方式
/// - Parameters:
///   - bOpen: 是否开启
///   - bFront: 是否前置摄像头
///   - width: 流宽
///   - height: 流高
///   - bitrate: 码率 单位 kbps
///   - fps: 帧率
- (void)openCamera:(BOOL)bOpen bFront:(BOOL)bFront width:(int)width height:(int)height bitrate:(int)bitrate fps:(int)fps;

/// 禁用HEVC编码的流,只能禁用不能决定是否开启
/// - Parameter bDisable: 是否禁用
- (void)disableHEVCStream:(BOOL)bDisable;

/// 禁用AV1编码的流,只能禁用不能决定是否开启
/// - Parameter bDisable: 是否禁用
- (void)disableAV1Stream:(BOOL)bDisable;

#pragma mark - 音频相关

/// 设置云端音量
/// - Parameter volume: 取值范围是[0,100]
- (void)setCloudVolume:(int)volume;

/// 设置音频流状态,暂停|继续,必须串流成功后才生效
/// - Parameter status: 见`JGStreamStatus`
- (void)setAudioStreamStatus:(JGStreamStatus)status;

/// 发送音频数据到云端麦克风,并且采用是 Opus编码的 16bit,48k,单声道的音频数据
/// - Parameter audioData: 音频数据,长度建议20ms
- (void)sendAudioDataToCloudMicrophone:(NSData *)audioData;

/// 开启或关闭麦克风
/// - Parameter bMicrophone: YES 开启,NO 关闭
- (void)openMicrophone:(BOOL)bMicrophone;

/// 打开麦克风并录制成文件保存,但是不会同步发送到云端,返回结果为保存的路径
/// - Parameter bOpen:YES 开启,NO 关闭
- (NSString *)openLocalRecordMicphone:(BOOL)bOpen;

#pragma mark - 调试相关

/// 不经过后台,直接LS,仅用于调试
/// - Parameters:
///   - address: 直连地址
///   - port: 直连端口
///   - gameId: 游戏Id
- (void)directConnectionWithAddress:(NSString *)address port:(uint16_t)port gameId:(NSInteger)gameId;

/// 设置调试信息接收者,一般与 `JGDebug.framework` 配置使用.导入库后无需主动调用
/// - Parameter receiver: 接收者
- (void)setDebugInformationReceiver:(id<JGDebugDataSourceDelegate> _Nullable)receiver;

/// 关闭控制台日志输出
- (void)disableConsoleLog:(BOOL)bDisable;

/// 在视频上显示调试信息
- (void)toggleDebugInfoDisplayOnStreamView:(BOOL)shouldShow;

/// 禁用传输相关日志,默认启用
/// - Parameter disable: YES: 禁用 ,NO:启用
- (void)disableTransferLogs:(BOOL)disable;

/// 添加外部日志上报
/// - Parameters:
///   - level: 日志级别
///   - content: 日志内容
- (void)addLogWithLevel:(JGLogLevel)level content:(NSString *)content;

/// 指定云端的调试信息
/// - Parameters:
///   - info: 信息内容
///   - completionHandler: 结果
- (void)updateInstanceDebugWithInfo:(JGInstanceDebug *)info completion:(void(^)(NSInteger code,NSString *msg,NSError *error))completionHandler;

/// 仅用于奔溃捕获测试,点击即奔溃
- (void)testCrash;

/// 外部向内部注入事件通知
/// - Parameters:
///   - code: 4位状态码
///   - eventId: 7位事件码
///   - parameter: 事件附带参数
///   - description: 事件描述信息
- (void)injectEventWithCode:(NSInteger)code eventId:(NSInteger)eventId parameter:(NSDictionary * _Nullable)parameter description:(NSString * _Nullable)description;

#pragma mark - 一些工具接口

/// 获取指定长度的随机字符串
/// - Parameter lenght: 长度
- (NSString *)ramdomStringWithLength:(int)lenght;

/// 从1970年计算机元年到现在的毫秒数
- (uint64_t)millisecondsFrom1970;

/// 检查是否是有效的扫码手柄二维码文本. 返回YES表示有效
/// - Parameter text: 被检查文本内容
- (BOOL)effectiveQRCodeController:(NSString *)text;

@end

#pragma mark - migu

#define SET_OPTION_ROOMID         @"roomid"
#define SET_OPTION_TRYROOMID      @"try_roomid"
#define SET_OPTION_AREATYPE       @"area_type"
#define SET_OPTION_TRYAREATYPE    @"try_area_type"
#define SET_OPTION_IPV6           @"use_ipv6"
#define SET_OPTION_CREATECTRL     @"create_controller"
#define SET_OPTION_HWCURSOR       @"show_mouse_hwcursor"
#define SET_OPTION_MOUSEMODE      @"mouse_touch_mode"
#define SET_OPTION_SESSIONID      @"session_id"
#define SET_OPTION_ENTRYUUID      @"entry_uuid"
#define SET_OPTION_ENTRYNAME      @"entry_archive_name"
#define SET_OPTION_WALLPAPER      @"wall_paper_id"
#define SET_OPTION_FRAMEINFO      @"callback_frame_decodeinfo"
#define SET_OPTION_IGNORED_FIRSTINPUT    @"ignored_firstinput_event"
#define SET_OPTION_STATUSBAR_HEIGHT      @"status_bar_height"
#define SET_ENABLE_MAXMIN_VRJOYSTICK_HANDLE @"set_enable_maxmin_vrjoystick_handle"
#define SET_OPTION_MAXTIME        @"max_hangup_timeout_length"
#define SET_OPTION_RSET_ID        @"usr_rset_id"

@interface JGVividEngine()

- (void)setOptionValue:(NSString*)value forKey:(NSString*)key;

// 咪咕设置分配区域
//@param applyMode 申请模式 需要传area_spec_list才能生效 0表示有兜底 1表示无需兜底
//@param areaSpecList 申请区域规格列表
- (void)setAreaType:(int)applyMode areaSpecList:(NSArray<JGAreaSpecInfo *>*) areaSpecList;

@end



NS_ASSUME_NONNULL_END
